/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package otcapp.controlador;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import otcapp.controlador.jdialogs.asignarProfesional.AsignacionesAnterioresJDialog;
import otcapp.controlador.jinternalFrame.AsignarProfesionalPantalla;
import otcapp.controlador.modeloTablas.ModeloTabla;
import otcapp.controlador.modeloTablas.ModeloTablaAsignacionesAnteriores;
import otcapp.controlador.modeloTablas.ModeloTablaAsignarProfesional;
import otcapp.controlador.modelocombobox.ModeloComboProfesional;
import otcapp.controlador.seguridadDecoradores.FabricaContrladores;
import otcapp.dto.ExpedienteCedulaOtraDTO;
import otcapp.entidades.AsignacionProfesional;
import otcapp.entidades.Personal;
import otcapp.experto.ExpertoAsignarProfesional;
import otcapp.experto.ExpertoConsultarPieza;
import otcapp.experto.excepciones.ExpertoAsignarProfesionalException;
import otcapp.experto.excepciones.ExpertoConsultarPiezaException;
import otcapp.fabricas.FabricaExpertos;
import otcapp.utiles.tablas.RenderTablaAsignacionPersonal;

/**
 *
 * @author diego
 */
public class AsignarProfesionalControlador implements Controlador {

    private AsignarProfesionalPantalla pantalla;
    private ExpertoConsultarPieza consultarPiezas;
    private ExpertoAsignarProfesional experto;
    private boolean ingresandoNuevoProfesional;
    private AsignacionesAnterioresJDialog asignacionesAnteriores;
    private ExpedienteCedulaOtraDTO piezaSeleccionada;

    public AsignarProfesionalControlador() {
        pantalla = new AsignarProfesionalPantalla();
        experto = (ExpertoAsignarProfesional) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ASIGNAR_PROFESIONAL);
        consultarPiezas = (ExpertoConsultarPieza) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.CONSULTAR_PIEZA);

        pantalla.getCabecera().getTítulo().setText("Asignar Profesionales");
        pantalla.getCabecera().getIcono().setIcon(new ImageIcon(this.getClass().getResource("../utiles/imagenes/iconos/Notes-black-48.png").getPath()));
        
        asignacionesAnteriores = new AsignacionesAnterioresJDialog(((ControladorPrincipal)FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).getPantallaPrincipal(), true);
        asignacionesAnteriores.setLocationRelativeTo(null);

        pantalla.getBtnBuscarPieza().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                buscarPiezas();
            }
        });

        pantalla.getBtnAsignar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                asignarProfesional();
            }
        });

        pantalla.getBtnNuevoPersonal().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                iniciarABMProfesional();
            }
        });

        pantalla.getCbxEstado().addMouseListener(new MouseAdapter() {

            @Override
            public void mouseEntered(MouseEvent e) {
                pantalla.getCbxProfesional().setEnabled(false);
                pantalla.getCbxProfesional().setSelectedIndex(0);
                pantalla.getCbxEstado().setEnabled(true);
            }
        });

        pantalla.getCbxProfesional().addMouseListener(new MouseAdapter() {

            @Override
            public void mouseEntered(MouseEvent e) {
                pantalla.getCbxEstado().setEnabled(false);
                pantalla.getCbxEstado().setSelectedIndex(0);
                pantalla.getCbxProfesional().setEnabled(true);
            }
        });

        pantalla.getBtnSalir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                finalizar();
            }
        });

        pantalla.getTblPiezas().getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarPieza();
            }
        });
        
        pantalla.getBtnMostrarAsigAnteriores().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                mostrarAsignacionesAnteriores();
            }
        });
        
        asignacionesAnteriores.getBtnAceptar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                asignacionesAnteriores.setVisible(false);
            }
        });
        

    }

    @Override
    public void iniciar() {
        pantalla.setVisible(true);

        pantalla.getTblPiezas().setModel(new ModeloTablaAsignarProfesional());
        pantalla.getTblPiezas().setDefaultRenderer(Object.class, new RenderTablaAsignacionPersonal());
        try {
            ((ModeloTablaAsignarProfesional) pantalla.getTblPiezas().getModel()).setListaElementos(consultarPiezas.buscarExpedientesYOtrasPiezasXEstado(ExpertoConsultarPieza.estados.NO_ASIGNADA));
        } catch (ExpertoConsultarPiezaException ex) {
            System.out.println("Buscando piezas no asignadas: " + ex.getMessage());
        }
        asignacionesAnteriores.getTblAsignacionesAnteriores().setModel(new ModeloTablaAsignacionesAnteriores());
        setEstadoPanelAsignar(opcion.DESACTIVAR);
        iniciarCombos();

    }

    private void iniciarCombos() {
        pantalla.getCbxProfesional().setModel(new ModeloComboProfesional(experto.buscarPersonal()));
        pantalla.getCbxPsicologo().setModel(new ModeloComboProfesional(experto.buscarPsicologos()));
        pantalla.getCbxTrabajadoraSocial().setModel(new ModeloComboProfesional(experto.buscarTrabajadorSocial()));
    }
    
    private void seleccionarPieza(){
        int fila = pantalla.getTblPiezas().getSelectedRow();
        int filaModelo = pantalla.getTblPiezas().convertRowIndexToModel(fila);
        if (fila == -1) {
            return;
        }
        piezaSeleccionada = (ExpedienteCedulaOtraDTO) ((ModeloTabla) pantalla.getTblPiezas().getModel()).getRow(filaModelo);
        setEstadoPanelAsignar(opcion.ACTIVAR);
    }

    private void buscarPiezas() {
        try {
            ((ModeloTabla) pantalla.getTblPiezas().getModel()).clear();
            if (pantalla.getCbxEstado().getSelectedIndex() > 0) {
                
                List piezas;
                                
                switch(pantalla.getCbxEstado().getSelectedItem().toString()){
                    case "Profesional Asignado":
                        piezas = consultarPiezas.buscarExpedientesYOtrasPiezasXEstado(ExpertoConsultarPieza.estados.ASIGNADAS);
                        break;
                    case "NO Asignada":
                        piezas = consultarPiezas.buscarExpedientesYOtrasPiezasXEstado(ExpertoConsultarPieza.estados.NO_ASIGNADA);
                        break;
                    case "Finalizada":
                        piezas = consultarPiezas.buscarExpedientesYOtrasPiezasXEstado(ExpertoConsultarPieza.estados.FINALIZADAS);
                        break;
                    case "NO Finalizada":
                        piezas = consultarPiezas.buscarExpedientesYOtrasPiezasXEstado(ExpertoConsultarPieza.estados.NO_FINALIZADAS);
                        break;
                    default:
                        piezas = null;
                }
                
                
                ((ModeloTabla) pantalla.getTblPiezas().getModel()).setListaElementos(piezas);
            } else if (pantalla.getCbxProfesional().getSelectedIndex() > 0) {
                Personal prof = ((ModeloComboProfesional) pantalla.getCbxProfesional().getModel()).getItemSeleccionado();
                ((ModeloTabla) pantalla.getTblPiezas().getModel()).setListaElementos(consultarPiezas.buscarPiezasProfesional(prof));
            }
        } catch (ExpertoConsultarPiezaException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    private void asignarProfesional() {
        List<Personal> listaPersonal = new ArrayList<>();
        if (pantalla.getCbxPsicologo().getSelectedIndex() > 0) {
            listaPersonal.add(((ModeloComboProfesional) pantalla.getCbxPsicologo().getModel()).getItemSeleccionado());
            piezaSeleccionada.setPsicologo(((ModeloComboProfesional) pantalla.getCbxPsicologo().getModel()).getItemSeleccionado());
        }
        if (pantalla.getCbxTrabajadoraSocial().getSelectedIndex() > 0) {
            listaPersonal.add(((ModeloComboProfesional) pantalla.getCbxTrabajadoraSocial().getModel()).getItemSeleccionado());
            piezaSeleccionada.setTrabajadoraSocial(((ModeloComboProfesional) pantalla.getCbxTrabajadoraSocial().getModel()).getItemSeleccionado());
        }

        String observacion = pantalla.getTxtObservaciones().getText();
        try {
            experto.asignarProfesionalPieza(listaPersonal, piezaSeleccionada, observacion);
        } catch (ExpertoAsignarProfesionalException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.WARNING_MESSAGE);
            return;
        }
        JOptionPane.showMessageDialog(pantalla, "Personal Asignado", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        ((ModeloTabla) pantalla.getTblPiezas().getModel()).fireTableDataChanged();
        pantalla.getCbxPsicologo().setSelectedIndex(0);
        pantalla.getCbxTrabajadoraSocial().setSelectedIndex(0);
        pantalla.getTxtObservaciones().setText("");
        setEstadoPanelAsignar(opcion.DESACTIVAR);
    }

    private void iniciarABMProfesional() {
        ingresandoNuevoProfesional = true;
        ((ABMPersonalControlador)((ControladorPrincipal)FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).iniciarContrlador(ControladorPrincipal.controlador.ABM_PERSONAL)).setRetornoAsignarProfesional(true);
    }

    private enum opcion {

        ACTIVAR, DESACTIVAR
    }

    private void setEstadoPanelAsignar(opcion op) {
        boolean valor = false;
        switch (op) {
            case ACTIVAR:
                valor = true;
                break;
            case DESACTIVAR:
                valor = false;
                break;
        }
        pantalla.getCbxPsicologo().setEnabled(valor);
        pantalla.getCbxTrabajadoraSocial().setEnabled(valor);
        pantalla.getTxtObservaciones().setEnabled(valor);
        pantalla.getBtnAsignar().setEnabled(valor);
    }
    
    private void mostrarAsignacionesAnteriores(){
        if(piezaSeleccionada == null){
            return;
        }
        List<AsignacionProfesional> asignacionesPieza = experto.buscarAsignacionesAnteriores(piezaSeleccionada);
        ((ModeloTabla)asignacionesAnteriores.getTblAsignacionesAnteriores().getModel()).clear();
        if(asignacionesPieza.isEmpty()){
            JOptionPane.showMessageDialog(pantalla, "La pieza ingresada no tiene asignaciones anteriores");
            return;
        }
        ((ModeloTabla)asignacionesAnteriores.getTblAsignacionesAnteriores().getModel()).setListaElementos(asignacionesPieza);
        asignacionesAnteriores.setVisible(true);
    }

    @Override
    public void finalizar() {
        pantalla.setVisible(false);
    }

    @Override
    public Component getPantalla() {
        return pantalla;
    }

    @Override
    public void continuar() {
        if (ingresandoNuevoProfesional) {
            iniciarCombos();
            ingresandoNuevoProfesional = false;
        } else {
            iniciar();
        }
        pantalla.setVisible(true);

    }
}
